/*
    asyframe for asyframe@gmail.com

    Copyright (C) 2011, asyframe@gmail.com, http://asyframe.googlecode.com/

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
	(at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
	along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#include "stdafx.h"
#include "ConstDef.h"
#include "Common/Logger.h"
#include "Common/Interface.h"
#include "Common/ThreadHandler.h"
#include "Common/WorkerBase.h"
#include "Common/AppBase.h"
#include "Common/BufferPool.h"
#include "Common/IoBuffer.h"

namespace asyframe
{
	IoBuffer::IoBuffer( boost::shared_ptr<WorkerBase> _pWorker, SizeType _size )
		:pVectorData_(NULL),beginOffset_(0),endOffset_(0),pBuffer_(NULL),bufferCapacity_(0),pWorker_(_pWorker)
	{
		R0(_pWorker->getBufferPool()->safeMalloc((void*&)pBuffer_, _size, bufferCapacity_));
	}

	IoBuffer::IoBuffer( std::vector<byte>* _pVectorData )
		:pVectorData_(_pVectorData),beginOffset_(0),endOffset_(0),pBuffer_(NULL),bufferCapacity_(0),pWorker_()
	{
		if(_pVectorData)
		{
			bufferCapacity_ = _pVectorData->size();
			if(_pVectorData->size()>0)
				pBuffer_ = &(*pVectorData_)[0];
			else
				pBuffer_ = NULL;
		}
	}

	IoBuffer::~IoBuffer()
	{
		beginOffset_ = 0;
		endOffset_ = 0;
		if(boost::shared_ptr<WorkerBase> pWorker = pWorker_.lock())
		{
			pWorker->getBufferPool()->safeFree((void*)pBuffer_, bufferCapacity_);
			pBuffer_ = NULL;
			bufferCapacity_ = 0;
		}
		pWorker_.reset();
		pVectorData_ = NULL;
	}
} /* namespace asyframe */
